/**
 * 需要校验token，是否登录，没有登录跳转登录页
 *
 * 1.配置pages.json，与style同级中加入 "checkToken": true
 * 2.注意：如果是相对路径 ../index 会重复，需要处理下，要不写绝对路径跳转，要不尾部路径不能重复
 */
import store from "@/store/index";

export function checkToken(path) {
  try {
    if (!path) return false;
    let pages = uni.getStorageSync("__APP__pages");
    let pathName = normalizePath(path);
    let checkTokenList = pages.filter((item) => item.path.indexOf(pathName) > -1);
    // 尝试使用全路径判断是否只有一个路由
    if (checkTokenList.length > 1) {
      let list = checkTokenList.filter((item) => item.path == "/" + pathName);
      if (list.length == 1) checkTokenList = list;
    }
    if (checkTokenList.length == 1 && checkTokenList[0].checkToken && !store.getters.token) {
      console.log("路由守卫：检测到需要校验token，未登录，跳转登录页", store.getters.token);
      // 校验token为空
      uni.navigateTo({
        url: import.meta.env.VITE_PAGE_LOGIN,
      });
      return true;
    } else if (checkTokenList.length > 1) {
      console.log(`路由守卫出错了，检索到了${checkTokenList.length}个路由，路由地址为：${pathName}`);
    }
    return false;
  } catch (error) {
    console.log("路由守卫报错：", error);
    return false;
  }
}

function normalizePath(path) {
  const pageStack = getCurrentPages();
  // 当前页面（跳转前）
  const currentPage = pageStack[pageStack.length - 1];
  // 截取当前页面路径 （最后一个'/'）
  const currentPath = currentPage.route.substring(0, currentPage.route.lastIndexOf("/") + 1);
  return calculateAbsolutePath(path, "/" + currentPath);
}

function calculateAbsolutePath(relativePath, currentPath) {
  if (relativePath.startsWith("/")) {
    return relativePath;
  }
  let absolutePath = currentPath;
  const relativeParts = relativePath.split("/");

  for (const part of relativeParts) {
    if (part === "..") {
      // 回退到上一级目录
      const lastSlashIndex = absolutePath.lastIndexOf("/");
      if (lastSlashIndex > 0) {
        // 避免回退到根目录之外
        absolutePath = absolutePath.substring(0, lastSlashIndex);
      }
    } else if (part !== "." && part !== "") {
      // 添加到当前路径
      absolutePath = absolutePath.endsWith("/") ? `${absolutePath}${part}` : `${absolutePath}/${part}`;
    }
  }

  return absolutePath;
}
